import React, { Component } from 'react';
// 导入routes路由配置
import routes from "./routes";
//导入路由相关的模块
import {BrowserRouter, Switch, Route} from "react-router-dom"; 
/*
BrowserRouter:该组件用来包裹Switch，主要作用是用来设置路由切换的方式为浏览器模式。
Switch:用来完成对一组路由的管理，可以根据用户浏览时使用的路由完成路径的匹配和跳转
Route:路由，用来实例化一个路由实例。
Redirect:重定向组件，用来完成路由的重定向
*/ 
/*
Route的属性描述
exact:用来设置路由匹配是否是严格匹配
path:用来设置路由的路径
component:用来设置路由匹配之后用来渲染的组件
*/ 
//导入自定义组件Common
import Common from "../componets/common/common";
import metas from "./metas";

// 创建路由管理对象
class index extends Component {
    render() {
        console.log(metas);
        return (
            <BrowserRouter>
                <Route path="/" children={(props)=>{
                    return (<Common {...props} meta={metas[props.location.pathname]}>
                        <Switch>
                            {routes.map((route)=>{
                                return this.createCommonRoute(route);
                            })}
                        </Switch>
                    </Common>);
                }}/>
            </BrowserRouter>
        );
    }
    //定义函数完成普通路由(不含子级路由的)的实例构建
    createBasicRoute(route){
        //获取路由信息的系统数据
        const {component, path} = route; 
        return <Route key={path} exact path={path} component={component}/>;
    }
    //定义函数完成通用路由的实例构建
    createCommonRoute(route){
        //该函数内部用来构建一个路由，根据路由参数route信息进行构建
        const {children, path, component:Father} = route;
        if(children){
            //该路由存储子级路由
            return <Route key={path} path={path} children={(props)=>{
                return (
                    <Father>
                        <Switch>
                            {children.map((route1)=>{
                                let routeTemp = {...route1, path:route.path+route1.path};
                               
                                return this.createCommonRoute(routeTemp)
                            })}
                        </Switch>
                    </Father>
                )
            }}/> 
        }else{
            //当路由不存在子级路由时，用来返回一个普通路由
            return this.createBasicRoute(route); 
        } 
    } 
}

export default index;